public class Solution268 {
    /**
     * 给定一个包含 0, 1, 2, ..., n 中 n 个数的序列，找出 0 .. n 中没有出现在序列中的那个数。
     *
     * 示例 1:
     *
     * 输入: [3,0,1]
     * 输出: 2
     * 示例 2:
     *
     * 输入: [9,6,4,2,3,5,7,0,1]
     * 输出: 8
     */

    /*
     1.一个数与他本身异或为0;
     2.一个数与0异或为0;
     只要把所有的元素和索引做异或运算，成对的数字会消为0，只有落单的元素会剩下；
     */
    public int missingNumber(int[] nums) {
        int n = nums.length;
        int res = 0;
        res ^= n;
        for (int i = 0; i < n; i++) {
            res ^= i ^ nums[i];
        }
        return res;
    }

    // 1~n相加 ，减去nums的和
    public int missingNumber2(int[] nums) {
        int n = nums.length;
        //等差数列公式
        int expect = n * (n + 1) / 2;
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        return expect - sum;
    }

    // 消除等差数列乘法可能溢出的bug，边加边减
    public int missingNumber3(int[] nums) {
        int n = nums.length;
        int res = 0;
        res += n - 0;
        for (int i = 0; i < n; i++) {
            res += i - nums[i];
        }
        return res;
    }
}
